package main

import "fmt"

func main() {
	selectExam()

	//  没有缓冲区的管道，管道不能读也不能写，select阻塞
	c := make(chan string)
	selectForChan(c)

	// 有缓冲区，没数据， 管道可以写入，写操作对应的case执行，函数退出
	c = make(chan string, 1)
	selectForChan(c)

	// 有缓冲区，数据满了， 管道可以读取，读操作对应的case执行，函数退出
	c = make(chan string, 1)
	c <- "hello"
	selectForChan(c)

	// 有缓冲区，有数据且没满， 管道可以读取也可以写入，select随机挑选一个case执行，函数退出
	c = make(chan string, 2)
	c <- "hello"
	selectForChan(c)
}

func selectForChan(c chan string) {
	var recv string
	send := "hello"
	select {
	case recv = <-c:
		fmt.Printf("received %s\n", recv)
	case c <- send:
		fmt.Printf("sent %s\n", send)

	}
}

// 如果case中操作了nil的管道，那么该case会被忽略，所以函数从default退出
func selectExam() {
	var c chan string
	select {
	case c <- "hello":
		fmt.Println("sent")
	default:
		fmt.Println("default")
	}
}
